package com.xhblog.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xhblog.entity.Tag;
import com.xhblog.entity.vo.TagVo;
import com.xhblog.mapper.TagMapper;
import com.xhblog.result.Result;
import com.xhblog.service.TagService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author pengyouhong
 * create 2022/5/17 18:11
 */
@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements TagService {

    @Resource
    private TagMapper tagMapper;

    @Override
    public List<TagVo> findTagByArticleId(Long id) {
        List<Tag> tagList = tagMapper.findTagByArticleId(id);

        //将标签实体类对象集合转换为标签vo集合
        List<TagVo> tagVoList = copyList(tagList);
        return tagVoList;
    }

    /**
     * 根据limit返回热门标签id集合
     *
     * @param limit 热门标签的数量
     * @return 返回统一返回对象，包含热门标签id集合
     */
    @Override
    public Result hots(int limit) {

        //查询出最热门的前几个标签的id集合，根据limit
        List<Long> tagIdList = tagMapper.findHotTagIdsByLimit(limit);

        //如果idList为null，返回null
        if (tagIdList.isEmpty()) {
            return Result.success(Collections.emptyList());
        }

        List<Tag> tagList = tagMapper.selectBatchIds(tagIdList);

        return Result.success(tagList);
    }

    /**
     * 将标签实体类对象集合转换为标签vo集合
     *
     * @param tagList 标签实体类集合
     * @return 返回标签vo集合
     */
    private List<TagVo> copyList(List<Tag> tagList) {
        List<TagVo> tagVoList = new ArrayList<>();


        tagList.forEach(tag -> {
            tagVoList.add(copy(tag));
        });
        return tagVoList;
    }

    /**
     * 将tag标签实体类对象转换为标签vo对象
     *
     * @param tag 标签实体类对象
     * @return 标签vo对象
     */
    private TagVo copy(Tag tag) {
        TagVo tagVo = new TagVo();
        BeanUtils.copyProperties(tag, tagVo);

        tagVo.setId(tag.getId().toString());

        return tagVo;
    }
}
